#ifndef __TB6600_H__
#define __TB6600_H__

#include <stddef.h>
#include "main.h"
#include "tim.h"
#include "gpio.h"


/*-------------宏定义------------*/
#define __TIM1_ENABLE__
// #define __TIM2_ENABLE__
// #define __TIM3_ENABLE__
// #define __TIM4_ENABLE__


/*------------常量定义------------*/
#define Step_DEFAULT_Angle      1.8     // 步距角
#define SPEED_DEFAULT_MAX       1000    // 最大转速(rpm)
#define CIRCLE_DEFAULT_MAX      1000    // 最大圈数
#define ACCELERATION_DEFAULT    100     // 加速度

/* TB6600 默认参数 */
#define TB6600_DEFAULT_CONFIG {             \
    .Step_Angle     = Step_DEFAULT_Angle,   \
    .Speed_Max_rpm  = SPEED_DEFAULT_MAX,    \
    .Circle_Max     = CIRCLE_DEFAULT_MAX,   \
}

/* TB6600 默认运行状态 */
#define TB6600_DEFAULT_STATE {                  \
    .Step_Target    = 0,                        \
    .Ena            = TB6600_Enable_Disable,    \
    .Auto_Speed     = TB6600_AutoSpeed_Disable, \
    .Acceleration   = ACCELERATION_DEFAULT,     \
    .Dir            = TB6600_Direction_CW,      \
    .Speed_Now      = 0,                        \
    .Step_Now       = 0,                        \
    .State_Update   = TB6600_STATE_Update_True, \
}

/* TB6600 脉冲任务初始化 */
#define TB6600_DEFAULT_TASK {                   \
    .Tim1_SpeedUpdate   = Speed_Change_None,    \
    .Tim2_SpeedUpdate   = Speed_Change_None,    \
    .Tim3_SpeedUpdate   = Speed_Change_None,    \
    .Tim4_SpeedUpdate   = Speed_Change_None,    \
    .Tim1_Step          = 0,                    \
    .Tim2_Step          = 0,                    \
    .Tim3_Step          = 0,                    \
    .Tim4_Step          = 0,                    \
}


/*------------枚举定义------------*/
/* TB6600 细分数 */
typedef enum{
    TB6600_Microstep_NC = 0,
    TB6600_Microstep_1,
    TB6600_Microstep_2_A,
    TB6600_Microstep_2_B,
    TB6600_Microstep_4,
    TB6600_Microstep_8,
    TB6600_Microstep_16,
    TB6600_Microstep_32,
}TB6600_Microstep;

/* TB6600 接线方式 */
typedef enum{
    TB6600_Circuit_Anode = 0,   // 共阳接线
    TB6600_Circuit_Cathode,     // 共阴接线
}TB6600_Circuit;

/* TB6600 脉冲方式 */
typedef enum{
    TB6600_PUL_Mode_GPIO = 0,
    TB6600_PUL_Mode_TIM,
}TB6600_PUL_Mode;

/* TB6600 方向枚举 */
typedef enum{
    TB6600_Direction_CW = 0,    // 顺时针
    TB6600_Direction_CCW,       // 逆时针
}TB6600_Direction;

/* TB6600 使能枚举 */
typedef enum{
    TB6600_Enable_Disable = 0,
    TB6600_Enable_Enable,
}TB6600_Enable;

/* TB6600 转动速度自动控制 */
typedef enum{
    TB6600_AutoSpeed_Disable = 0,
    TB6600_AutoSpeed_Ensable,
}TB6600_AutoSpeed;

/* TB6600 运行状态更改标志 */
typedef enum{
    TB6600_STATE_Update_True = 0,
    TB6600_STATE_Update_None,
}TB6600_StateUpdate;

/* 定时器使能 */
typedef enum{
    Speed_Change_None = 0,
    Speed_Change_True,
}TB6600_SpeedUpdate;


/*------------结构体定义-----------*/
/* TB6600 参数配置 */
typedef struct TB6600_Config{
    // 以下参数为用户配置
    TB6600_Microstep    MicroStep;      // 细分
    TB6600_Circuit      Circuit_AC;     // 接线方式
    TB6600_PUL_Mode     PulMode;        // 脉冲产生方式
    TIM_HandleTypeDef*  htim;           // PWM 定时器
    uint32_t            TIM_Channel;    // PWM 通道
    GPIO_TypeDef*       PUL_GPIOx;      // PUL_GPIO 端口
    uint16_t            PUL_GPIO_Pin;   // PUL_GPIO 引脚
    GPIO_TypeDef*       DIR_GPIOx;      // DIR_GPIO 端口
    uint16_t            DIR_GPIO_Pin;   // DIR_GPIO 引脚
    GPIO_TypeDef*       ENA_GPIOx;      // ENA_GPIO 端口
    uint16_t            ENA_GPIO_Pin;   // ENA_GPIO 引脚
    // 以下参数用户可选配置
    float               Step_Angle;     // 步距角
    uint32_t            Speed_Max_rpm;  // 最大速度(rpm)
    uint32_t            Circle_Max;     // 转动最大圈数
    // 以下参数为内部使用
    uint16_t            Pulse_Rev;      // 每圈脉冲数
    uint32_t            Speed_Max_hz;   // 最大速度(每秒脉冲数)
    uint32_t            Step_Max;       // 转动最大步数
}TB6600_ConfigTypedef;

/* TB6600 运行状态 */
typedef struct TB6600_State{
    // 以下参数为用户配置
    TB6600_ConfigTypedef*   Config;         // TB6600设置
    uint32_t                Speed_Target;   // 转动目标速度
    uint32_t                Step_Target;    // 转动目标步数(此参数初始化自动为0)
    // 以下参数用户可选配置
    TB6600_Enable           Ena;            // 电机使能
    TB6600_AutoSpeed        Auto_Speed;     // 开启转速控制
    uint16_t                Acceleration;   // 加速度
    // 以下参数为内部使用
    TB6600_Direction        Dir;            // 转动方向
    uint32_t                Speed_Now;      // 转动速度(此处为TIM频率)
    uint32_t                Step_Now;       // 当前已经转过的步数
    TB6600_StateUpdate      State_Update;   // 运行状态是否需要更新
}TB6600_StateTypedef;

/* TB6600 脉冲任务统计 */
typedef struct TB6600_Step_Task{
    TB6600_SpeedUpdate  Tim1_SpeedUpdate;   // 定时器速度更新标识
    TB6600_SpeedUpdate  Tim2_SpeedUpdate;
    TB6600_SpeedUpdate  Tim3_SpeedUpdate;
    TB6600_SpeedUpdate  Tim4_SpeedUpdate;
    int32_t            Tim1_Step;           // 定时器剩余脉冲数
    int32_t            Tim2_Step;
    int32_t            Tim3_Step;
    int32_t            Tim4_Step;
}TB6600_TaskTypedef;



/*------------函数声明------------*/
TB6600_ConfigTypedef TB6600_Init_TIM(TB6600_ConfigTypedef user_config);
TB6600_ConfigTypedef TB6600_Init_IO(TB6600_ConfigTypedef init_config);
TB6600_StateTypedef TB6600_State_Init(TB6600_StateTypedef init_state);
void TB6600_Set_Speed_hz(TB6600_StateTypedef *tb6600_state, uint32_t speed);
void TB6600_Set_Speed_rpm(TB6600_StateTypedef *tb6600_state, uint32_t speed);
void TB6600_Set_Ena(TB6600_StateTypedef *tb6600_state, TB6600_Enable ena);
void TB6600_Move_Step(TB6600_StateTypedef *tb6600_state, uint32_t step_num, TB6600_Direction dir);
void TB6600_Move_Angle(TB6600_StateTypedef *tb6600_state, double angle);
void TB6600_Move_Prog(TB6600_StateTypedef *state);

#endif // __TB6600_H__
